#include "TableroEditor.h"
#include <string>
#include <vector>

TableroEditor::TableroEditor() {
}

TableroEditor::TableroEditor(const Glib::RefPtr<Gtk::Builder>& refGlade) :
		builder(refGlade) {		
	builder->get_widget("wintablero", window);
	builder->get_widget("spinprob", spinprob);
	builder->get_widget("combocolor", combocolor);
	builder->get_widget("combotipo", combotipo);
	dirImagenFondo = "fondo_default.jpg";
	dirSonido = "sonido_default.wav";
	puntaje=10000;
	nivel=0;
	celdaSelected = NULL;
}

void TableroEditor::setDimensiones(int in_dimX, int in_dimY) {
	dimX = in_dimX;
	dimY = in_dimY;
}

void TableroEditor::setPuntaje(int valor) {
	puntaje = valor;
}

void TableroEditor::setNivel(int valor) {
	nivel = valor;
}

int TableroEditor::getPuntaje() {
	return puntaje;
}

CeldaEditor* TableroEditor::getCeldaSelected(){
	return celdaSelected;
	}
	
void TableroEditor::setProbSeleccionada(){
	int idTipo = combotipo->get_active_row_number();
	int idColor = combocolor->get_active_row_number();
	int valor;
	valor=getProbSeleccionada(idTipo,idColor);
	spinprob->set_value(valor);
	spinprob->show();
	}

void TableroEditor::generarTablero(int in_dimX, int in_dimY) {
	setDimensiones(in_dimX, in_dimY);
	int numCelda = 0;
	for (int x = 0; x < dimX; x++) {
		for (int y = 0; y < dimY; y++) {
			CeldaEditor* celda = Gtk::manage(new CeldaEditor());
			celda->setContenedor(this);
			celda->setEsCelda(true);
			celda->setNumCelda(numCelda);
			celda->setImgVaciaSelected("imagenes/vaciaselect.png");
			celda->setImgLlenaSelected("imagenes/llenaselect.png");
			celda->setImgVacia("imagenes/vacia.png");
			celda->setImgLlena("imagenes/llena.png");
			celda->getDatos()->setTagCelda("numCelda");
			//parte del gtk
			celda->show();
			vecCeldas.push_back(celda);
			window->add(*celda);
			window->move(*celda, y * 64 + 20, x * 64 + 20);
			numCelda++;
		}
	}
	//agregamos columnas
	for (int y = 0; y < dimY; y++) {
		CeldaEditor* celda = Gtk::manage(new CeldaEditor());
		celda->setContenedor(this);
		celda->setEsCelda(false);
		celda->setNumCelda(y);
		celda->setImgVaciaSelected("imagenes/columnaselect.png");
		celda->setImgLlenaSelected("imagenes/columnaselect.png");
		celda->setImgVacia("imagenes/vacia.png");
		celda->setImgLlena("imagenes/vacia.png");
		celda->getDatos()->setTagCelda("numCol");
		vecCeldas.push_back(celda);
		window->add(*celda);
		window->move(*celda, y * 64 + 20, dimX * 64 + 60);
	}
	window->show();
}

int TableroEditor::getX() {
	return dimX;
}

int TableroEditor::getY() {
	return dimY;
}

bool TableroEditor::activoSeleccion() {
	Gtk::ToggleButton *toggleselect;
	builder->get_widget("toggleselect", toggleselect);
	return toggleselect->get_active();
}

void TableroEditor::setCeldaSelected(CeldaEditor* celda) {
		celdaSelected=celda;
	}


void TableroEditor::refrescarTablero() {

	for (std::vector<CeldaEditor*>::iterator it = vecCeldas.begin();
			it != vecCeldas.end(); ++it) {
		if (celdaSelected->getNumCelda() != (*it)->getNumCelda())
			(*it)->desactivarSeleccion();
	}
}

void TableroEditor::setVacias() {
	for (std::vector<CeldaEditor*>::iterator it = vecCeldas.begin();
			it != vecCeldas.end(); ++it) {
		(*it)->actualizarCelda();
	}
}

int TableroEditor::getProbSeleccionada(int idTipo, int idColor){
	int valor=15;
	if (celdaSelected != NULL) {
		switch (idTipo) {
		case 0:
			switch (idColor) {
			case 0:
				valor = celdaSelected->getDatos()->getProbButtDefault();
				break;
			case 1:
				valor = celdaSelected->getDatos()->getProbButtAma();
				break;
			case 2:
				valor = celdaSelected->getDatos()->getProbButtAzu();
				break;
			case 3:
				valor = celdaSelected->getDatos()->getProbButtRoj();
				break;
			case 4:
				valor = celdaSelected->getDatos()->getProbButtVer();
				break;
			case 5:
				valor = celdaSelected->getDatos()->getProbButtVio();
				break;
			}
			break;

		case 1:

			switch (idColor) {
			case 0:
				valor = celdaSelected->getDatos()->getProbBarDefault();
				break;
			case 1:
				valor = celdaSelected->getDatos()->getProbBarAma();
				break;
			case 2:
				valor = celdaSelected->getDatos()->getProbBarAzu();
				break;
			case 3:
				valor = celdaSelected->getDatos()->getProbBarRoj();
				break;
			case 4:
				valor = celdaSelected->getDatos()->getProbBarVer();
				break;
			case 5:
				valor = celdaSelected->getDatos()->getProbBarVio();
				break;
			}
			break;
		case 2:
			valor = celdaSelected->getDatos()->getProbStarDefault();
			break;
		}}
		return valor;
	}

void TableroEditor::cargarDatosAtablero(Json::Value bookJson) {
	  
		generarTablero(bookJson["numFilas"].asInt(), bookJson["numColumnas"].asInt());

	  int num;  
		// celdas
	  	for (Json::Value::iterator it = bookJson["celdas"].begin(); it != bookJson["celdas"].end(); ++it) {
	   num= (*it)["numCelda"].asInt();
	   vecCeldas[num]->setVacia(!(*it)["vacia"].asBool());
	   vecCeldas[num]->getDatos()->setProbButtAma((*it)["pButAma"].asInt());
	   vecCeldas[num]->getDatos()->setProbButtAzu((*it)["pButAzu"].asInt());
	   vecCeldas[num]->getDatos()->setProbButtRoj((*it)["pButRoj"].asInt());
	   vecCeldas[num]->getDatos()->setProbButtVer((*it)["pButVer"].asInt());
	   vecCeldas[num]->getDatos()->setProbButtVio((*it)["pButVio"].asInt());
	   vecCeldas[num]->getDatos()->setProbBarAma((*it)["pBarAma"].asInt());
	   vecCeldas[num]->getDatos()->setProbBarAzu((*it)["pBarAzu"].asInt());
	   vecCeldas[num]->getDatos()->setProbBarRoj((*it)["pBarRoj"].asInt());
	   vecCeldas[num]->getDatos()->setProbBarVer((*it)["pBarVer"].asInt());
	   vecCeldas[num]->getDatos()->setProbBarVio((*it)["pBarVio"].asInt());
	   	   vecCeldas[num]->getDatos()->setProbBarDefault((*it)["pBarDef"].asInt());
	   vecCeldas[num]->getDatos()->setProbStarDefault((*it)["pStarDef"].asInt());
	   	   vecCeldas[num]->getDatos()->setProbButtDefault((*it)["pButDef"].asInt());
	  }
	  
	  //calculamos el numero de columnas en el vector de celdas
	   
	   for (Json::Value::iterator it = bookJson["columnas"].begin(); it != bookJson["columnas"].end(); ++it) {
	   num= (*it)["numCol"].asInt() + (bookJson["numFilas"].asInt()*bookJson["numColumnas"].asInt());
	   vecCeldas[num]->getDatos()->setProbButtDefault((*it)["pButDef"].asInt());
	   vecCeldas[num]->getDatos()->setProbButtAma((*it)["pButAma"].asInt());
	   vecCeldas[num]->getDatos()->setProbButtAzu((*it)["pButAzu"].asInt());
	   vecCeldas[num]->getDatos()->setProbButtRoj((*it)["pButRoj"].asInt());
	   vecCeldas[num]->getDatos()->setProbButtVer((*it)["pButVer"].asInt());
	   vecCeldas[num]->getDatos()->setProbButtVio((*it)["pButVio"].asInt());
	   vecCeldas[num]->getDatos()->setProbBarDefault((*it)["pBarDef"].asInt());
	   vecCeldas[num]->getDatos()->setProbBarAma((*it)["pBarAma"].asInt());
	   vecCeldas[num]->getDatos()->setProbBarAzu((*it)["pBarAzu"].asInt());
	   vecCeldas[num]->getDatos()->setProbBarRoj((*it)["pBarRoj"].asInt());
	   vecCeldas[num]->getDatos()->setProbBarVer((*it)["pBarVer"].asInt());
	   vecCeldas[num]->getDatos()->setProbBarVio((*it)["pBarVio"].asInt());
	   vecCeldas[num]->getDatos()->setProbStarDefault((*it)["pStarDef"].asInt());
	  }
	  setVacias();
	}
	

void TableroEditor::setDirFondo(std::string dirImagen) {
	dirImagenFondo = dirImagen;
}

void TableroEditor::setDirSonido(std::string dir) {
	dirSonido = dir;
}

Json::Value TableroEditor::toJson() {
	Json::Value book_json(Json::objectValue);

	book_json["numFilas"] = getX();

	book_json["numColumnas"] = getY();

	book_json["fondo"] = dirImagenFondo;
	
	book_json["sonido"] = dirSonido;

	book_json["puntaje"] = puntaje;
	
	book_json["nivel"] = nivel;

	Json::Value vecCeldas_json(Json::arrayValue);
	Json::Value vecCol_json(Json::arrayValue);

	for (std::vector<CeldaEditor*>::iterator it = vecCeldas.begin();
			it != vecCeldas.end(); ++it) {
		if ((*it)->getEsCelda() == true) {
			vecCeldas_json.append((*it)->ToJson());
		}
	}
	book_json["celdas"] = vecCeldas_json;

	for (std::vector<CeldaEditor*>::iterator it = vecCeldas.begin();
			it != vecCeldas.end(); ++it) {
		if ((*it)->getEsCelda() == false) {
			vecCol_json.append((*it)->ToJson());
		}
	}
	book_json["columnas"] = vecCol_json;

	return book_json;
}

